<template>
  <div class="flex flex-wrap">
    <div v-if="modelValue && preview">
      <el-image v-if="typeof modelValue == 'string'" :src="modelValue" fit="cover"
                class="w-[100px] h-[100px] rounded border mr-2"></el-image>
      <div v-else class="flex flex-wrap">
        <div class="relative mx-1 mb-2 w-[100px] h-[100px]" v-for="(url, index) in modelValue" :key="index">
          <el-icon class="absolute right-[5px] top-[5px] cursor-pointer bg-white rounded-full
            " style="z-index: 10" @click="removeImage(url)">
            <CircleClose />
          </el-icon>
          <el-image :src="url.image" fit="cover" class="w-[100px] h-[100px] rounded border mr-2"></el-image>
        </div>
      </div>
    </div>

    <div v-if="preview" class="choose-image-btn" @click="open">
      <el-icon :size="25" class="text-gray-500">
        <Plus />
      </el-icon>
    </div>
    <el-dialog title="选择图片" v-model="dialogVisible" width="80%" top="5vh">
      <el-container class="bg-white rounded" style="height: 70vh">
        <el-header class="image-header">
          <el-button type="primary" size="small" @click="handleOpenCreate">新增图片分类</el-button>
          <el-button type="warning" size="small" @click="handleOpenUpload">上传图片</el-button>
        </el-header>
        <el-container>
          <ImageAside ref="ImageAsideRef" @change="handleAsideChange" />
          <ImageMain :limit="limit" openChoose ref="ImageMainRef" @choose="handleChoose" />
        </el-container>
      </el-container>

      <template #footer>
        <span>
          <el-button @click="close">取消</el-button>
          <el-button type="primary" @click="submit">确定</el-button>
        </span>
      </template>
    </el-dialog>
  </div>
</template>
<script setup>
import { number } from 'echarts'
import { ref,onMounted } from 'vue'
import ImageAside from '~/components/ImageAside.vue'
import ImageMain from '~/components/ImageMain.vue'
import { toast } from "~/composables/util";
const dialogVisible = ref(false)
const callbackFunction = ref(null)
const open = (callback = null) => {
  callbackFunction.value = callback
  dialogVisible.value = true
}
const close = () => (dialogVisible.value = false)

const ImageAsideRef = ref(null)
const handleOpenCreate = () => ImageAsideRef.value.handleCreate()

const ImageMainRef = ref(null)
const handleAsideChange = (image_class_id) => ImageMainRef.value.loadData(image_class_id)

const handleOpenUpload = () => ImageMainRef.value.openUploadFile()


const props = defineProps({
  modelValue: [String, Array],
  limit: {
    type: Number,
    default: 1,
  },
  preview: {
    type: Boolean,
    default: true
  },
})
const emit = defineEmits(['update:modelValue', 'getImageId'])

const removeImage = (url) => emit('update:modelValue', props.modelValue.filter((u) => u != url))

let urls = []
const handleChoose = (e) => { urls = e }

const submit = () => {
  let value = []
  if (props.limit == 1) {
    value = urls[0]
  }
  else {
    value = props.preview ? [...props.modelValue, ...urls] : [...urls]
    // 根据id重复去重
    let value_id = {}
    value = value.reduce(function (item, next) {
      value_id[next.id] ? '' : value_id[next.id] = true && item.push(next)
      return item
    }, [])

    if (value.length > props.limit) {
      let limit = props.preview ? (props.limit - props.modelValue.length) : props.limit
      return toast('已选择' + props.modelValue.length + '张，本次最多只能选择' + limit + '张')
    }
  }

  if (value && props.preview) {
    if (props.limit == 1) {
      emit('getImageId', value.id)
      emit('update:modelValue', value.image)
    }
    else {
      emit('update:modelValue', value)
      emit('getImageId', value.map((o) => o.id))
    }

  }
  if (!props.preview && typeof callbackFunction.value === "function") {
    callbackFunction.value(value.map((o) => o.image))
  }
  close()
}
defineExpose({
  open
})
</script>
<style>
.image-header {
  border-bottom: 1px solid #eeeeee;
  @apply flex items-center;
}

.choose-image-btn {
  @apply w-[100px] h-[100px] rounded border flex justify-center items-center cursor-pointer hover: (bg-gray-100);
}
</style>